From 4a3f21b693d98853d82918c92005d5cbbe30db03 Mon Sep 17 00:00:00 2001 From: Paolo Borelli Date: Sat, 11 Jan 2014 19:15:18 +0100 Subject: [PATCH] Prelight notebook tab Set the prelight state when hovering a notebook tab with the mouse. https://bugzilla.gnome.org/show_bug.cgi?id=711233 --- gtk/gtknotebook.c | 59 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index e40d277729..43bf4c8f6b 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -129,6 +129,7 @@ struct _GtkNotebookPrivate GtkNotebookDragOperation operation; GtkNotebookPage *cur_page; GtkNotebookPage *detached_tab; + GtkNotebookPage *prelight_tab; GtkTargetList *source_targets; GtkWidget *action_widget[N_ACTION_WIDGETS]; GtkWidget *dnd_window; @@ -353,6 +354,8 @@ static gboolean gtk_notebook_button_press (GtkWidget *widget, static gboolean gtk_notebook_button_release (GtkWidget *widget, GdkEventButton *event); static gboolean gtk_notebook_popup_menu (GtkWidget *widget); +static gboolean gtk_notebook_enter_notify (GtkWidget *widget, + GdkEventCrossing *event); static gboolean gtk_notebook_leave_notify (GtkWidget *widget, GdkEventCrossing *event); static gboolean gtk_notebook_motion_notify (GtkWidget *widget, @@ -656,6 +659,7 @@ gtk_notebook_class_init (GtkNotebookClass *class) widget_class->button_press_event = gtk_notebook_button_press; widget_class->button_release_event = gtk_notebook_button_release; widget_class->popup_menu = gtk_notebook_popup_menu; + widget_class->enter_notify_event = gtk_notebook_enter_notify; widget_class->leave_notify_event = gtk_notebook_leave_notify; widget_class->motion_notify_event = gtk_notebook_motion_notify; widget_class->grab_notify = gtk_notebook_grab_notify; @@ -1672,6 +1676,7 @@ gtk_notebook_get_property (GObject *object, * gtk_notebook_button_press * gtk_notebook_button_release * gtk_notebook_popup_menu + * gtk_notebook_enter_notify * gtk_notebook_leave_notify * gtk_notebook_motion_notify * gtk_notebook_focus_in @@ -1913,7 +1918,7 @@ gtk_notebook_realize (GtkWidget *widget) attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask |= (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | - GDK_POINTER_MOTION_MASK | GDK_LEAVE_NOTIFY_MASK); + GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); attributes_mask = GDK_WA_X | GDK_WA_Y; priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget), @@ -1996,9 +2001,13 @@ notebook_tab_prepare_style_context (GtkNotebook *notebook, GtkRegionFlags flags = 0; GtkStateFlags state = gtk_style_context_get_state (context); - if (page != NULL && - page == notebook->priv->cur_page) - state |= GTK_STATE_FLAG_ACTIVE; + if (page != NULL) + { + if (page == notebook->priv->cur_page) + state |= GTK_STATE_FLAG_ACTIVE; + if (page == notebook->priv->prelight_tab) + state |= GTK_STATE_FLAG_PRELIGHT; + } gtk_style_context_set_state (context, state); @@ -3257,16 +3266,48 @@ gtk_notebook_button_release (GtkWidget *widget, return FALSE; } +static void +tab_prelight (GtkNotebook *notebook, + GdkEvent *event) +{ + GtkNotebookPrivate *priv = notebook->priv; + GList *tab; + gint x, y; + + if (get_widget_coordinates (GTK_WIDGET (notebook), (GdkEvent *)event, &x, &y)) + { + tab = get_tab_at_pos (notebook, x, y); + if ((tab == NULL && priv->prelight_tab != NULL) || + (tab != NULL && tab->data != priv->prelight_tab)) + { + priv->prelight_tab = tab == NULL ? NULL : tab->data; + gtk_notebook_redraw_tabs (notebook); + } + } +} + +static gboolean +gtk_notebook_enter_notify (GtkWidget *widget, + GdkEventCrossing *event) +{ + GtkNotebook *notebook = GTK_NOTEBOOK (widget); + + tab_prelight (notebook, (GdkEvent *)event); + + return FALSE; +} + static gboolean gtk_notebook_leave_notify (GtkWidget *widget, GdkEventCrossing *event) { GtkNotebook *notebook = GTK_NOTEBOOK (widget); GtkNotebookPrivate *priv = notebook->priv; - gint x, y; - if (!get_widget_coordinates (widget, (GdkEvent *)event, &x, &y)) - return FALSE; + if (priv->prelight_tab != NULL) + { + tab_prelight (notebook, (GdkEvent *)event); + } if (priv->in_child) { @@ -3411,6 +3452,8 @@ gtk_notebook_motion_notify (GtkWidget *widget, priv->timestamp = event->time; + tab_prelight (notebook, (GdkEvent *)event); + /* While animating the move, event->x is relative to the flying tab * (priv->drag_window has a pointer grab), but we need coordinates relative to * the notebook widget. @@ -4986,6 +5029,8 @@ gtk_notebook_real_remove (GtkNotebook *notebook, if (priv->detached_tab == list->data) priv->detached_tab = NULL; + if (priv->prelight_tab == list->data) + priv->prelight_tab = NULL; if (priv->switch_tab == list) priv->switch_tab = NULL; -- 2.30.2